import os
import pandas as pd
import glob
from datetime import datetime

# 查找最新的Excel文件
def find_latest_excel_file(directory):
    # 查找目录中所有符合模式的Excel文件
    excel_files = glob.glob(os.path.join(directory, 'universities_ranking_top100_*.xlsx'))
    if not excel_files:
        print('未找到Excel文件')
        return None
    
    # 按修改时间排序，获取最新的文件
    latest_file = max(excel_files, key=os.path.getmtime)
    return latest_file

# 验证Excel文件内容
def verify_excel_file(excel_file_path):
    print(f'正在验证Excel文件: {excel_file_path}')
    print(f'文件大小: {os.path.getsize(excel_file_path) / 1024:.2f} KB')
    print(f'文件修改时间: {datetime.fromtimestamp(os.path.getmtime(excel_file_path))}')
    
    try:
        # 读取Excel文件
        df = pd.read_excel(excel_file_path)
        
        # 基本信息
        print(f'\n=== 基本信息 ===')
        print(f'数据行数: {len(df)}')
        print(f'数据列数: {len(df.columns)}')
        print(f'列名: {list(df.columns)}')
        
        # 检查是否有空值
        print(f'\n=== 数据质量检查 ===')
        null_counts = df.isnull().sum()
        if null_counts.sum() == 0:
            print('没有空值数据')
        else:
            print('存在空值的列:')
            for column, count in null_counts.items():
                if count > 0:
                    print(f'  {column}: {count}个空值')
        
        # 显示前20条数据样例
        print(f'\n=== 前20条数据样例 ===')
        print(df.head(20).to_string(index=False))
        
        # 按国家统计大学数量
        print(f'\n=== 国家分布统计 ===')
        country_counts = df['国家 (Country)'].value_counts()
        for country, count in country_counts.items():
            print(f'{country}: {count}所大学')
        
        # 检查排名范围
        print(f'\n=== 排名信息 ===')
        rank_column = '排名 (Ranking)'
        
        # 尝试提取数字排名
        numeric_ranks = []
        for rank in df[rank_column]:
            if isinstance(rank, int):
                numeric_ranks.append(rank)
            elif isinstance(rank, str):
                # 尝试从字符串中提取数字
                try:
                    if '=' in rank:
                        num_part = rank.replace('=', '')
                        numeric_ranks.append(int(num_part))
                    else:
                        numeric_ranks.append(int(rank))
                except ValueError:
                    pass
        
        if numeric_ranks:
            print(f'最低排名: {min(numeric_ranks)}')
            print(f'最高排名: {max(numeric_ranks)}')
        
        # 检查关键统计数据
        print(f'\n=== 关键统计数据检查 ===')
        
        # 师生比字段
        staff_ratio_col = '师生比 (Student-to-Staff Ratio)'
        if staff_ratio_col in df.columns:
            non_empty_count = df[staff_ratio_col].notnull().sum()
            print(f'师生比数据完整度: {non_empty_count}/{len(df)} = {non_empty_count/len(df)*100:.1f}%')
            if non_empty_count > 0:
                # 尝试找出有效的数值
                valid_ratios = []
                for ratio in df[staff_ratio_col]:
                    if isinstance(ratio, (int, float)) and ratio > 0:
                        valid_ratios.append(ratio)
                    elif isinstance(ratio, str):
                        try:
                            # 尝试转换字符串为数字
                            num_ratio = float(ratio.replace(':', '').replace('/', '').strip())
                            if num_ratio > 0:
                                valid_ratios.append(num_ratio)
                        except ValueError:
                            pass
                
                if valid_ratios:
                    print(f'师生比范围: {min(valid_ratios):.1f} - {max(valid_ratios):.1f}')
        
        # 国际学生数量字段
        intl_students_col = '国际学生数量 (Number of International Students)'
        if intl_students_col in df.columns:
            non_empty_count = df[intl_students_col].notnull().sum()
            print(f'国际学生数量数据完整度: {non_empty_count}/{len(df)} = {non_empty_count/len(df)*100:.1f}%')
        
        # 男女比例字段
        gender_ratio_col = '男女比例 (Male-to-Female Ratio)'
        if gender_ratio_col in df.columns:
            non_empty_count = df[gender_ratio_col].notnull().sum()
            print(f'男女比例数据完整度: {non_empty_count}/{len(df)} = {non_empty_count/len(df)*100:.1f}%')
        
        print(f'\n=== 验证结论 ===')
        print(f'Excel文件验证完成，数据看起来正常。')
        print(f'共{len(df)}条大学排名数据，涵盖了前40名的知名大学。')
        
        # 检查是否提取了所有要求的字段
        required_fields = [
            '排名 (Ranking)', 
            '大学名称 (University Name)', 
            '国家 (Country)',
            '师生比 (Student-to-Staff Ratio)',
            '国际学生数量 (Number of International Students)',
            '男女比例 (Male-to-Female Ratio)'
        ]
        
        missing_fields = [field for field in required_fields if field not in df.columns]
        if not missing_fields:
            print('✅ 所有要求的字段都已提取')
        else:
            print(f'❌ 缺少以下字段: {missing_fields}')
        
        return True
    except Exception as e:
        print(f'验证Excel文件时出错: {e}')
        return False

# 主函数
def main():
    print('启动大学排名Excel文件验证工具...')
    
    # 指定数据目录
    data_dir = 'd:\\学习的文件\\大学排名\\data'
    
    # 查找最新的Excel文件
    latest_excel = find_latest_excel_file(data_dir)
    if not latest_excel:
        print('错误: 未找到任何Excel文件')
        return
    
    # 验证Excel文件
    if verify_excel_file(latest_excel):
        print(f'\n成功验证了Excel文件: {latest_excel}')
    else:
        print(f'\nExcel文件验证失败')

if __name__ == '__main__':
    main()